home *** CD-ROM | disk | FTP | other *** search
-
- *****************************************************
- * SPECIAL THANKS TO ALAN SIMPSON'S FINE BOOK *
- * "ADVANCED TECHNIQUES IN dBASE III PLUS" *
- * THAT INSPIRED ME TO WRITE THIS PROCEDURE. *
- *****************************************************
-
- * ---------------------------------------------------------------------------
- * DISPLAY AN OPTION MENU, AND FETCH CHOICE BY USING CURSOR UP/DOWN OR NUMBER
- * ---------------------------------------------------------------------------
- * DATE: 10/22/86
- *
- * PROGRAMMER: D. L. Raney (GEnie address: D.L.RANEY)
- * 2612 CASTLE DR. also
- * BLUE SPRINGS, MO. 64015 (The Programmers Exchange BBS)
- * ( 816-228-1957 )
- *
- * LANGUAGE: dBIII+
- *
- * PURPOSE: To present user with a highlight bar menu option list. Using this
- * they may use the cursor keys to select, or press an entry number.
- *
- * USE: This procedure may be used to display any menu with up to 9 options.
- * The option strings for prompts must be set before calling this
- * procedure.
- * EXAMPLE:
- * OPT1='1. Append record'
- * OPT2='2. Edit record'
- * And so on........ Up to 9 options (OPT9)
- *
- * You must call it with two parameters. The first will return the number
- * that the user selected. The second is used internally by the procedure
- * to display the correct number of options and return a number within
- * that range. An example of the proper way to call this procedure is,
- * EXAMPLE:
- * SELECTION = 0
- * DO WHILE SELECTION # 3
- * OPTHEADER = 'MAIN MENU TRAVEL SYSTEM DATA BASE'
- * OPT1 = '1. Add records to data base'
- * OPT2 = '2. Edit records in data base'
- * OPT3 = '3. Exit to system'
- * DO FETCH_OPT WITH SELECTION, 3
- * DO CASE
- * CASE SELECTION = 1
- * DO APPENDREC && --- MAY ALSO USE FETCH_OPT
- * CASE SELECTION = 2
- * DO EDITREC && --- MAY ALSO USE FETCH_OPT
- * ENDCASE
- * ENDDO
- *
- * END OF EXAMPLE
- *
- * INPORTANT NOTE: Make sure the variables OPT1-9 and OPTHEADER are
- * GLOBAL variables.
- * Also, the OPTHEADER must not be longer than 50
- * characters. This because the procedure will auto-
- * maticly append the system date and time to the
- * string. If OPTHEADER is "MAIN MENU", then the out
- * put would be similar to the following,
- *
- * "MAIN MENU DATE:10/22/86 TIME:01:15:54"
- *
- * ---------------------------------------------------------------------------
-
-
- PROCEDURE FETCH_OPT
- PARAMETERS CHOICE, NUMOPT
-
- * ------- CHOICE RETURN SELECTION NUMBER PICKED
- * ------- NUMOPT TELLS PROGRAM HOW MANY OPTIONS TO DISPLAY
-
- * ---------------------------------------------------------------------------
- * INITIALIZE THE PROGRAM AND VARIABLES
- * ---------------------------------------------------------------------------
-
- PRIVATE DONE, CNT, MAXOPTLEN
- DONE = .F. && USED FOR MAIN LOOP TEST FOR RETURN
- CNT = 1 && USED AS A LOOP COUNTER
- MAXOPTLEN = 0 && USED TO FIND A CENTERING POINT FOR OPTION LIST
- OPTCOL = 0 && ALL OPTIONS START AT THIS COLUMN POINTER
-
- * ---------------------------------------------------------------------------
- * FIND LENGTH OF THE LONGEST OPTION PARAMETER
- * SHOULD TELL US THE LONGEST STRING LENGTH SO WE CAN CENTER ALL AVALABLE
- * OPTIONS ON THE SCREEN
- * ---------------------------------------------------------------------------
-
- DO WHILE CNT <= NUMOPT
- SUB = STR(CNT,1)
- IF LEN(OPT&SUB) > MAXOPTLEN
- MAXOPTLEN = LEN(OPT&SUB)
- ENDIF
- CNT = CNT + 1
- ENDDO ( CNT )
- OPTCOL = (INT((79-MAXOPTLEN)/2))
-
- *----------------------------------------------------------------------------
- * DISPLAY OPTION LIST
- *----------------------------------------------------------------------------
-
- CNT = 1
- CLEAR
- OPTHEADER = OPTHEADER + ' Date:' + DTOC(DATE()) + ' Time:' + TIME()
- @ 1,0 TO 3,79 DOUBLE && DRAW TITLE BOX
- @ 2,(INT((79-LEN(OPTHEADER))/2)) SAY OPTHEADER && ---- CENTERED HEADER
- @ 5,0 TO (8+NUMOPT),79 DOUBLE && ---- FRAME OPTIONS LIST
- DO WHILE CNT <= NUMOPT
- SUB = STR(CNT,1)
- @ (6+CNT),OPTCOL SAY OPT&SUB
- CNT = CNT + 1
- ENDDO ( CNT )
-
- * ---------------------------------------------------------------------------
- * DISPLAY INSTRUCTIONS WITH GRAPHICS CHARACTERS
- * ---------------------------------------------------------------------------
-
- @ (9+NUMOPT),0 TO (12+NUMOPT),79 DOUBLE && ---- FRAME HELP SCREEN
- @ (10+NUMOPT),18 SAY 'Highlight option by using'
- @ (10+NUMOPT),44 SAY CHR(24) + ' or ' + CHR(25) + ' and press ' + CHR(17) + CHR(217)
- @ (11+NUMOPT),22 SAY 'or press appropriate menu number.'
-
-
- *----------------------------------------------------------------------------
- * INITIALIZE MEMORY VARIABLES
- *----------------------------------------------------------------------------
-
- OPT = 1
- SUB = STR(OPT,1)
- KEYPRESS = 0
- CHOICE = 0
-
- * ----------- SET REVERSE VIDEO ON NUMBER ONE
- @ (6+OPT),OPTCOL GET OPT&SUB
- CLEAR GETS
-
- * ----------- LOOP FOR SELECTING MENU OPTIONS
-
- DO WHILE .NOT. DONE
-
- * ------- WAIT FOR KEYPRESS
- KEYPRESS = 0
- DO WHILE KEYPRESS = 0
- KEYPRESS = INKEY()
- ENDDO ( KEYPRESS )
-
- * ------- ARROW KEY PRESSED
- IF KEYPRESS = 24 .OR. KEYPRESS = 5
- @ OPT+6,OPTCOL SAY OPT&SUB
- OPT = IIF(KEYPRESS = 24, OPT+1,OPT-1)
- OPT = IIF(OPT > NUMOPT, 1, OPT)
- OPT = IIF(OPT < 1, NUMOPT, OPT)
- SUB = STR(OPT,1)
- @ OPT+6,OPTCOL GET OPT&SUB
- CLEAR GETS
- LOOP && CHOICE NOT MADE, GO BACK FOR MORE INPUT
- ENDIF
-
- * ------- OPTION NUMBER ENTERED
- IF KEYPRESS >= 49 .OR. KEYPRESS <= (NUMOPT+48)
- CHOICE = KEYPRESS - 48
- ENDIF
-
- * ------- RETURN KEY PRESSED
- IF KEYPRESS = 13
- CHOICE = OPT
- ENDIF
-
- * ------- AN OPTION WAS SELECTED
- IF CHOICE > 0 .AND. CHOICE <= NUMOPT
- DONE = .T.
- ENDIF
- ENDDO ( DONE )
- RETURN